LinkedBlockingQueue
1. 前言
- 单向链表实现的FIFO阻塞队列
- 链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低
- 默认容量大小等于Integer.MAX_VALUE ,可设置队列容量大小
2. 源码分析
2.1 数据结构
1 | public class LinkedBlockingQueue<E> extends AbstractQueue<E> |
UML类图:
- 若某线程(线程A)要取出数据时,队列正好为空,则该线程会执行notEmpty.await()进行等待;当其它线程向队列中插入了数据之后,会调用notEmpty.signal()唤醒“notEmpty上的等待线程”。此时,线程A会被唤醒从而得以继续运行。 线程A在执行取操作前,会获取takeLock,在取操作执行完毕再释放takeLock。
- 若某线程(线程H)要插入数据时,队列已满,则该线程会它执行notFull.await()进行等待;当其它线程取出数据之后,会调用notFull.signal()唤醒“notFull上的等待线程”。此时,线程H就会被唤醒从而得以继续运行。 线程H在执行插入操作前,会获取putLock,在插入操作执行完毕才释放putLock。
2.2 核心函数
- 构造函数
1 | public LinkedBlockingQueue() { |
- 添加元素:offer(E e)
1 | public boolean offer(E e) { |
- 取出元素: take()
1 | public E take() throws InterruptedException { |
- iterator()
1 | public Iterator<E> iterator() { |